package com.hk.commons.img;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.List;


/**
 * @author Kevin
 */
public abstract class ImgMergeWrapper {

    /**
     * @param mergeCells 图片合成操作
     * @param fillColor  背景填充颜色，为空时不填充
     * @param width      画布 width
     * @param height     画布 height
     * @param ratio      根据图片指定 比率缩放，大于1时，会按比率缩小，小于1时会指定比率放大，不能小于等于0
     */
    public static BufferedImage mergeZoom(List<MergeCell> mergeCells, Color fillColor, int width,
                                          int height, float ratio) {
        var img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        var g2d = GraphicUtil.getG2d(img);
        if (null != fillColor) {
            g2d.setColor(fillColor);
            g2d.fillRect(0, 0, width, height);
        }
        mergeCells.forEach(cell -> cell.draw(g2d));
        if (ratio > 0.0f && ratio != 1.0f) {
            int w = (int) (width / ratio);
            int h = (int) (height / ratio);
            img = ratioZoom(img, w, h);
        }
        return img;
    }

    /**
     * 图片合成 ，不缩放
     *
     * @param mergeCells 图片合成操作
     * @param fillColor  背景填充颜色，为空时不填充
     * @param width      画布 width
     * @param height     画布 height
     */
    public static BufferedImage merge(List<MergeCell> mergeCells, Color fillColor,
                                      int width, int height) {
        return mergeZoom(mergeCells, fillColor, width, height, 1.0f);
    }

    /**
     * 图片合成 ，不缩放，白色填充
     *
     * @param mergeCells 图片合成操作
     * @param width      画布 width
     * @param height     画布 height
     */
    public static BufferedImage merge(List<MergeCell> mergeCells, int width, int height) {
        return mergeZoom(mergeCells, Color.WHITE, width, height, 1.0f);
    }

    /**
     * 将图片缩放指定 width 与 height
     *
     * @param srcImage 源图片
     * @param width    要缩放的 width
     * @param height   要缩放的 height
     */
    public static BufferedImage ratioZoom(BufferedImage srcImage, int width, int height) {
        Image image = srcImage.getScaledInstance(width, height, Image.SCALE_DEFAULT);
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = bufferedImage.createGraphics();
        graphics.drawImage(image, 0, 0, null);
        graphics.dispose();
        return bufferedImage;
    }

}
